﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JasRibbonApplicatie.Classes;
using JasRibbonApplicatie.Model;

namespace JasRibbonApplicatie
{
    internal sealed class Login
    {
        //all users are loaded here
        private static GebruikerModel gm = new GebruikerModel();
        private static List<Gebruiker> gebruikers = gm.GetAllLoginData();
        public bool IsBeheerder { get; set; }
        public Gebruiker User { get; private set; }
        public UserData UserData { get; private set; }
        /* referentie naar het MainWindow
         * Ik heb een referentie nodig naar het MainWindow
         * een alternatief om het niet hier te moeten zetten
         * is een ander object aanmaken, singleton, waarop zoals hier
         * Het MainWindow kan subscriben.
         * 
         * Leek me te omslachtig om enkel dit in te zetten
         */
        public MainWindow MainWindowReference { get; set; }
        public bool isLoggedIn { get; set; }


        public static Login Instance
        {
            get { return LoginHolder.instance; }
        }

        static class LoginHolder
        {
            static LoginHolder(){}
            internal static readonly Login instance = new Login();
        }

        // Summary:
        //      Makes a Login object. Nothing is specified yet about the user so Login.isLoggedIn is false.
        //
        public Login()
        {
            isLoggedIn = false;
        }

        // Summary:
        //      Searches information about the given user. Gets a user object from the 
        //      database if the user exists. Also preforms a check on the database if 
        //      the username is a magazijnier or not.
        //
        // Parameters:
        //      username:
        //      The username that is needed to search in the database.
        //
        // Returns:
        //      void
        //
        public void getUserInfo(string username)
        {
            if (username != String.Empty)
            {
                User = getGebruikerByUsername(username);
                if (User == null)
                {
                    // this is set to null for the passwordbox on the loginscreen to disappear.
                    User = null;
                }
            }
        }

        // Summary:
        //      Takes one specific user from all users
        //
        // Parameters:
        //      passwordText:
        //      The password that is needed for a specific user to login
        //
        // Returns:
        //      Null if the username doesn't exist in de database
        //
        private Gebruiker getGebruikerByUsername(String username)
        {
            username = username.ToLower();
            foreach (var gebruiker in gebruikers)
            {
                if (username.Equals(gebruiker.gebruikersnaam.ToLower()))
                    return gebruiker;
            }
            return null;
        }

        // Summary:
        //      Takes care that the user is completly logged of. So no more user information
        //      in the object and other things like isMagazijnier is also not set anymore.
        //
        public void userLogOff()
        {
            isLoggedIn = false;
            User = null;
            IsBeheerder = false;
        }

        public void loadUserData()
        {
            UserData = (User != null) ? UserData.Load(User.gebruiker_id) : null;
        }

        // Summary:
        //      Checks the password currently loaded in the User object with
        //      the given password.
        //
        // Parameters:
        //      passwordText:
        //      The password for a specific user in the database.
        //
        // Returns:
        //      true if the password is correct, else false
        //
        public bool CheckPassword(string passwordText)
        {
            string encryptedPasswordText = Encryptor.Sha1Encrypt(passwordText).ToLower();

            if (User.wachtwoord == encryptedPasswordText)
            {
                IsBeheerder = true;
                return true;
            }

            return false;
        }
    }
}